﻿using System;

namespace Algorithm.LeetCode
{
    /// <summary>
    /// 第六十七题：二进制求和
    /// </summary>
    public class No67
    {
        /*
         * 给你两个二进制字符串，返回它们的和（用二进制表示）。
         * 
         * 输入为 非空 字符串且只包含数字 1 和 0。
         */

        public static string AddBinary(string a, string b)
        {
            var result = string.Empty;
            //求出最大长度
            var totalLength = Math.Max(a.Length, b.Length);
            //根据最大长度补齐长度
            a = a.PadLeft(totalLength, '0');
            b = b.PadLeft(totalLength, '0');
            var lastValue = 0;
            //从最右边取值
            for (int i = totalLength - 1; i >= 0; i--)
            {
                //相加,包含上一次的进位数
                var temp = Convert.ToUInt16(a[i].ToString()) + Convert.ToUInt16(b[i].ToString()) + lastValue;
                var tempInsert = temp switch
                {
                    >= 2 => (temp % 2).ToString(),//结果为2写入0,进位1 结果为3写入1,进位1
                    _ => temp.ToString()//有0或1的情况直接写入
                };
                lastValue = temp / 2;
                result = result.Insert(0, tempInsert);
            }
            if (lastValue == 1)
            {
                //最后一次进位值,插入到最左边
                result = result.Insert(0, "1");
            }
            return result;
        }
    }
}
